package com.cskaoyan.javase.exception._1handle._0default;

/**
 * @description: Java的默认异常处理机制
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 异常的处理:
 *      1.java异常处理的基本单位是方法,如果方法可以处理就在方法体中处理它
 *          如果不行就抛给方法的调用者
 *      2.如果异常一直往上抛给方法的调用者,最终抛给JVM,JVM只能做默认处理
 *
 * JVM的默认处理机制的原则:
 *      1.JVM默认处理指的是不在方法的任何位置写异常处理的代码,只让异常默认处理
 *      2.编译时异常必须显式处理它,没有默认处理,这里默认处理指的是运行时异常
 *
 * JVM的默认处理机制:
 *      异常产生之前的代码都能正常执行,之后的代码都执行不了了
 *     - 如果错误产生在main方法中
 *   - 当我们的代码执行到错误行数之前，代码是正常执行的
 *   - 当我们的代码执行到错误行数时，JVM会终止程序的执行，抛出一个该异常信息封装成的对象
 *   - 将该对象中的异常信息，打印到控制台上，告诉程序员发生了什么问题
 *   - 发生错误之后的语句，都不执行了
 *
 * - 如果错误产生在main方法当中的另一个方法中
 *   - 当程序执行到该方法的错误行数时，JVM会终止程序的执行
 *     - 向上给方法的调用者抛出一个该异常信息封装成的对象
 *   - 一直向上抛出，直到抛给main方法，main方法最终抛给JVM
 *   - 发生异常之前的语句正常执行，但是之后的语句都不执行了
 *
 * 以上总结:
 *      对于运行时异常,程序产生运行时异常,会自动的往上抛出,直至JVM
 *      然后JVM终止程序,在控制台打印信息,发生异常之前的语句正常执行，但是之后的语句都不执行了
 *
 * 异常产生后就会导致程序终止,这在很多时候不是我们希望看到的,我们希望能够手动处理它
 *
 */
public class Demo {
    public static void main(String[] args) {
        System.out.println("before");
        //System.out.println(10/0);
        test();
        System.out.println("after");
    }

    private static void test() {
        System.out.println("before");
        test2();
        System.out.println("after");
    }

    private static void test2() {
        System.out.println("before");
        test3();
        System.out.println("after");
    }

    private static void test3() {
        System.out.println("before");
        System.out.println(10/0);
        System.out.println("after");
    }
}
